﻿using System;
using System.Configuration;
using System.IO;

namespace SetupBuilder
{
    /// <summary>
    /// Производит загрузку и обрабатывку настроек установочного пакета.
    /// </summary>
    public class Settings
    {
        /// <summary>
        /// Версия пакета.
        /// </summary>
        private string version;

        /// <summary>
        /// Путь до исходных файлов установочного пакета.
        /// </summary>
        private string sourcePath;

        /// <summary>
        /// Выходной путь msi пакета.
        /// </summary>
        private string outPath;

        /// <summary>
        /// Путь к папке установочного проекта.
        /// </summary>
        private string projectDir;

        /// <summary>
        /// Инициализирует настройки.
        /// </summary>
        /// <param name="version">Версия пакета.</param>
        /// <param name="sourcePath">Пусть к первичным файлам пакета.</param>
        /// <param name="outPath">Выходной путь msi пакета.</param>
        public Settings(string version, string sourcePath, string outPath)
        {
            if (string.IsNullOrEmpty(version))
            {
                throw new Exception("Версия не может быть пуста");
            }

            this.version = version;

            if (string.IsNullOrEmpty(sourcePath))
            {
                throw new Exception("Путь к исходным файлам проекта не может быть пустой.");
            }

            this.sourcePath = sourcePath;

            if (string.IsNullOrEmpty(outPath))
            {
                throw new Exception("Выходной путь не может быть пустым.");
            }

            this.outPath = outPath;

            this.projectDir = ConfigurationManager.AppSettings["ProjectDir"];

            if (string.IsNullOrEmpty(this.projectDir))
            {
                throw new Exception("Путь к папке с проектом пуст");
            }
        }

        /// <summary>
        /// Возвращает версию пакета.
        /// </summary>
        public string Version
        {
            get { return this.version; }
        }

        /// <summary>
        /// Возвращает путь к исходным файлам установочного пакета.
        /// </summary>
        public string SourcePath
        {
            get { return this.sourcePath; }
        }

        /// <summary>
        /// Возвращает выходной путь msi файла.
        /// </summary>
        public string OutPath
        {
            get { return this.outPath; }
        }

        /// <summary>
        /// Возвращает путь к папке с установочным проектом.
        /// </summary>
        public string ProjectDir
        {
            get { return this.projectDir; }
        }

        /// <summary>
        /// Устанавливает необходимые значения параметров в файле с переменными установочного проекта.
        /// </summary>
        /// <param name="variablesPath">Путь до файла с переменными установочного проекта.</param>
        public void SetVariables()
        {
            string variablesPath = Path.Combine(this.projectDir, "Variables.wxi");
            WixVariables variables;

            // Открываем файл.
            try
            {
                variables = new WixVariables(variablesPath);
            }
            catch (Exception ex)
            {
                throw new Exception("Ошибка при открытии Variables.wxi", ex);
            }

            // Изменяем значения параметров.
            try
            {
                // Если версия изменилась обновляем ProductCode.
                if (variables.GetElementValue("ProductVersion") != this.version)
                {
                    variables.ChangeElementValue("ProductCode", Guid.NewGuid().ToString());
                }

                variables.ChangeElementValue("ProductVersion", this.version);
                variables.ChangeElementValue("SourcePath", this.sourcePath);
                variables.ChangeElementValue("ResourceForUpdatePath", ConfigurationManager.AppSettings["ResourceForUpdatePath"]);
                variables.ChangeElementValue("ProductName", ConfigurationManager.AppSettings["ProductName"]);
                variables.ChangeElementValue("Manufacturer", ConfigurationManager.AppSettings["Manufacturer"]);

                variables.ChangeElementValue("PureFolders", ConfigurationManager.AppSettings["PureFolders"]);
                variables.ChangeElementValue("ExcludeFolders", ConfigurationManager.AppSettings["ExcludeFolders"]);
                variables.ChangeElementValue("ExcludeFiles", ConfigurationManager.AppSettings["ExcludeFiles"]);
                variables.ChangeElementValue("FullMatchDirectories", ConfigurationManager.AppSettings["FullMatchDirectories"]);
                variables.ChangeElementValue("CheckSumFile", ConfigurationManager.AppSettings["CheckSumFile"]);
            }
            catch (Exception ex)
            {
                throw new Exception("Ошибка при изменении Variables.wxi", ex);
            }

            // Сохраняем файл.
            try
            {
                variables.Save(variablesPath);
            }
            catch (Exception ex)
            {
                throw new Exception("Ошибка при сохранении Variables.wxi", ex);
            }
        }
    }
}
